package main

import "fmt"

func func1() {
	fmt.Println("我是 func1")
}
func func2() {
	fmt.Println("我是 func2")
}
func func3() {
	fmt.Println("我是 func3")
}
func main() {
	defer func1()
	defer func2()
	defer func3()
	fmt.Println("main1")
	fmt.Println("main2")

	i := 0
	defer func(a int) {
		fmt.Println(a)
	}(i)
	i++
	// 此时输出的值是0，而不是1，因为defer后面的函数在入栈的时候保存的是入栈那一刻的值，而当时i的值是0，所以后期对i进行修改，并不会影响栈内函数的值。

	j := 0
	defer func(a *int) {
		fmt.Println(*a)
	}(&j)
	j++
	// 此时输出的值是1，因为这里defer后面函数入栈的时候传入的执行变量i的指针，后期i值改变的时候，输出结果也会改变。
}
